// function asyncFunction(callback) {
//   setTimeout(() => {
//     const res = { code: 200, data: "hello world" };
//     callback(res);
//   }, 200);
// }

// // 回调地狱
// // es6 : promise
// asyncFunction((res) => {
//   console.log(res);
//   // 结果 的某一部分 当做另外一个请求的参数
//   asyncFunction((res) => {
//     console.log(res);
//   });
// });

// 回调方式拿结果
// function request(callback) {
//   const xhr = new XMLHttpRequest();
//   xhr.open("GET", "http://www.baidu.com", true);
//   xhr.send();
//   xhr.onreadystatechange = function () {
//     if (xhr.readyState === 4 && xhr.status === 200) {
//       console.log(xhr.responseText);
//       callback(xhr.responseText);
//     }
//   };
// }

// promise的源码
function asyncFunctionPromise() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const res = { code: 200, data: "hello world" };
      resolve(res);
    }, 200);
  });
}

// 回调地狱
// es6 : promise : 解决方案是链式调用
// asyncFunctionPromise()
//   .then((res) => {
//     console.log(res);
//   })
//   .then((res) => {});

// 异步的完美解决方案

function handlePromise(promiseThenAble) {
  return function (params) {
    return new Promise((resolve, reject) => {
      promiseThenAble(params).then(
        (res) => {
          resolve([null, res]);
        },
        (err) => {
          resolve([err, null]);
        }
      );
    });
  };
}

async function asyncFunction() {
  // await 后面跟的是一个promise对象
  const [err, res] = await handlePromise(asyncFunctionPromise)({ code: 200 });
  // 异步问题 同步化解决
  if (err) {
    // 处理错误的结果
    console.log("失败", err);
  } else {
    console.log("成功", res);
  }
  // await asyncRequest(res.code);
}

asyncFunction();
